// 进行 axios二次封装： 使用请求与响应拦截器
import axios from 'axios'
import { ElMessage } from 'element-plus'

const errorStatus = (status: number) => {
  let message = ''

  switch (status) {
    case 400:
      message = '请求错误(400)'
      break

    case 401:
      message = '未授权，请重新登录(401)'
      window.location.hash = '/'
      break

    case 403:
      message = '拒绝访问(403)'
      break

    case 404:
      message = '请求不存在(404)'
      break

    case 408:
      message = '请求超时(408)'
      break

    case 500:
      message = '服务器错误(500)'
      break

    case 501:
      message = '服务未实现(501)'
      break

    case 502:
      message = '网络错误(502)'
      break

    case 503:
      message = '服务不可用(503)'
      break

    case 504:
      message = '网络超时(504)'
      break

    case 505:
      message = 'HTTP版本不受支持(505)'
      break

    default:
      message = `错误码(${status})!`
  }

  return `${message}，请检查网络或联系管理员！`
}

// 利用axios对象的create方法，创建实例
const request = axios.create({
  // 基础路径, 利用环境变量做到根据不同环境切换不同路径
  //baseURL: 'http://47.94.221.242:11583',
  baseURL: 'http://127.0.0.1:11583',
  timeout: 5000, // 超时时间
})

// 给实例添加请求与相应拦截器
request.interceptors.request.use((config) => {
  // config配置对象，headers属性请求头，经常给服务器端携带公共参数
  config.headers.setAuthorization('XXL')
  config.headers.setContentType('application/x-www-form-urlencoded')
  // 返回配置对象
  return config
})

// 响应拦截器
request.interceptors.response.use(
  (response) => {
    //成功回调

    const status = response.status
    const msg = '错误异常'

    if (status < 200 || status >= 300) {
      // 处理http错误，抛到业务代码
      // msg = errorStatus(status)
      if (typeof response.data === 'string') {
        response.data = { msg }
      } else {
        response.data.msg = msg
      }
    }

    return response
  },
  (error) => {
    //失败回调
    // http状态码
    const status = error.response.status
    // 存储网络错误信息
    const message = errorStatus(status)

    ElMessage({ message, type: 'error', duration: 2000 })

    return Promise.reject(error)
  },
)

export default request
